package com.lee.nio.channel;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * MappedByteBuffer
 * MappedByteBuffer可让文件直接在内存(堆外内存)修改，操作系统不需要拷贝一次
 *
 * @author dralee
 * @date 2021-12-28 23:39:26
 **/
public class MappedByteBufferTest {
    public static void main(String[] args) throws IOException {
        RandomAccessFile randomAccessFile = new RandomAccessFile("1.txt", "rw");
        // 获取对应fileChannel
        FileChannel fileChannel = randomAccessFile.getChannel();
        /**
         * 参数1：FileChannel.MapMode.READ_WRITE 使用读写模式
         * 参数2：0可：可直接修改的起始位置
         * 参数3：5：是映射到内存大小，即将1.txt的多少个字节映射到内存
         *      可直接修改的范围就是0~5（不含5）
         *  MappedByteBuffer实际类型是DirectByteBuffer
         */
        MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 5);
        mappedByteBuffer.put(0, (byte) 'H');
        mappedByteBuffer.put(3, (byte) '9');

        fileChannel.close();
        randomAccessFile.close();
        System.out.println("修改成功~~");
    }
}
